home *** CD-ROM | disk | FTP | other *** search
- TYPE
- KbdStatusType = RECORD { Keyboard shift status record }
- InsOn,
- CapsLockOn,
- NumLockOn,
- ScrollLockOn,
- PauseOn,
- AltPressed,
- CtrlPressed,
- LeftShiftPressed,
- RightShiftPressed,
- InsPressed,
- CapsPressed,
- NumLockPressed,
- ScrollLockPressed,
- SysReqPressed : BOOLEAN;
- END;
-
- KbdBufSeqType = RECORD { Keyboard buffer key- }
- KbdCh : CHAR; { stroke sequence is }
- KbdScanCode : BYTE; { character followed by }
- END;
-
- KbdBufferType = RECORD { Keyboard buffer }
- KbdHead : INTEGER; { Circular buffer start }
- KbdTail : INTEGER; { and end. }
- KbdBuffer : ARRAY [1..16] OF KbdBufSeqType;
- END;
-
- VAR
- KbdStatus : KbdStatusType;
- KbdStatWrd : WORD;
-
- FUNCTION KbdGetStatus : WORD;
- VAR
- StatusLoc : WORD ABSOLUTE $0040:$0017;
- StatusWrd : WORD;
-
- BEGIN
- StatusWrd := SWAP (StatusLoc); { 8086 stores "backwards" }
- WITH KbdStatus DO BEGIN
- InsOn := ((StatusWrd and $8000) <> 0);
- CapsLockOn := ((StatusWrd and $4000) <> 0);
- NumLockOn := ((StatusWrd and $2000) <> 0);
- ScrollLockOn := ((StatusWrd and $1000) <> 0);
- AltPressed := ((StatusWrd and $0800) <> 0);
- CtrlPressed := ((StatusWrd and $0400) <> 0);
- LeftShiftPressed := ((StatusWrd and $0200) <> 0);
- RightShiftPressed := ((StatusWrd and $0100) <> 0);
- InsPressed := ((StatusWrd and $0080) <> 0);
- CapsPressed := ((StatusWrd and $0040) <> 0);
- NumLockPressed := ((StatusWrd and $0020) <> 0);
- ScrollLockPressed := ((StatusWrd and $0010) <> 0);
- PauseOn := ((StatusWrd and $0008) <> 0);
- SysReqPressed := ((StatusWrd and $0004) <> 0)
- END;
- KbdGetStatus := StatusWrd;
- END;
-
- PROCEDURE KbdSetInsMode (InsMode : BOOLEAN);
- VAR
- KbdStatLoc : WORD ABSOLUTE $0040:$0017;
- BEGIN
- IF InsMode THEN KbdStatLoc := KbdStatLoc OR $8000
- ELSE KbdStatLoc := KbdStatLoc AND $7FFF;
- END;
-
- PROCEDURE KbdSetCapsLock (CapsLock : BOOLEAN);
- VAR
- KbdStatLoc : WORD ABSOLUTE $0040:$0017;
- BEGIN
- IF CapsLock THEN KbdStatLoc := KbdStatLoc OR $4000
- ELSE KbdStatLoc := KbdStatLoc AND $BFFF;
- END;
-
- PROCEDURE KbdSetNumLock (NumLock : BOOLEAN);
- VAR
- KbdStatLoc : WORD ABSOLUTE $0040:$0017;
- BEGIN
- IF NumLock THEN KbdStatLoc := KbdStatLoc OR $2000
- ELSE KbdStatLoc := KbdStatLoc AND $DFFF;
- END;
-
- PROCEDURE KbdSetScrollLock (ScrollLock : BOOLEAN);
- VAR
- KbdStatLoc : WORD ABSOLUTE $0040:$0017;
- BEGIN
- IF ScrollLock THEN KbdStatLoc := KbdStatLoc OR $1000
- ELSE KbdStatLoc := KbdStatLoc AND $EFFF;
- END;
-
- FUNCTION KbdInsModeStatus : BOOLEAN;
- BEGIN
- KbdStatWrd := KbdGetStatus; { fill in KbdStatus }
- KbdInsModeStatus := KbdStatus.InsOn;
- END;
-
- FUNCTION KbdCapsLockStatus : BOOLEAN;
- BEGIN
- KbdStatWrd := KbdGetStatus; { fill in KbdStatus }
- KbdCapsLockStatus := KbdStatus.CapsLockOn;
- END;
-
- FUNCTION KbdNumLockStatus : BOOLEAN;
- BEGIN
- KbdStatWrd := KbdGetStatus; { fill in KbdStatus }
- KbdNumLockStatus := KbdStatus.NumLockOn;
- END;
-
- FUNCTION KbdScrollLockStatus : BOOLEAN;
- BEGIN
- KbdStatWrd := KbdGetStatus; { fill in KbdStatus }
- KbdScrollLockStatus := KbdStatus.ScrollLockOn;
- END;
-
- PROCEDURE KbdClear;
-
- VAR
- DosReg : Registers;
-
- BEGIN
- WITH DosReg DO BEGIN
- AX := $0C06; { Function C making a call to 6 }
- DX := $00FF; { Return immediately, do not wait}
- INTR (_DOS, DosReg);
- END;
- END;
-
- FUNCTION KbdNumValuesWaiting : WORD;
- VAR
- KeyBuffer : KbdBufferType ABSOLUTE $0040:$001A;
-
- BEGIN
- WITH KeyBuffer DO BEGIN
- IF KbdHead <= KbdTail THEN
- KbdNumValuesWaiting := (KbdTail-KbdHead) DIV 2
- ELSE
- KbdNumValuesWaiting := ((60-KbdHead)+(KbdTail-28)) DIV 2;
- END;
- END;
-
- FUNCTION KbdInputValue : WORD;
- VAR
- CBreakSave : BOOLEAN;
- DosReg : Registers;
-
- BEGIN
- {Using the below lines to wait for a keypressed is twice as fast
- as simply waiting for BIOS call to wait for a keypressed! - Hail IBM! }
-
- CBreakSave := CheckBreak;
- CheckBreak := FALSE;
-
- REPEAT
- UNTIL KEYPRESSED;
-
- CheckBreak := CBreakSave;
-
- WITH DosReg DO BEGIN
- AX := 0;
- INTR (_KEYBD, DosReg);
- IF AL = 0 THEN BEGIN
- KbdInputValue := $0100 + AH;
- KbdLastChar := #0;
- END
- ELSE BEGIN
- KbdInputValue := AL;
- KbdLastChar := CHR(AL);
- END;
- END;
- END;
-
- FUNCTION KbdKeyWaiting : BOOLEAN;
-
- VAR
- DosReg : Registers;
-
- BEGIN
- WITH DosReg DO BEGIN
- AH := 1;
- INTR (_KeyBd, DosReg);
- KbdKeyWaiting := ((FLAGS AND $0040) = 0);
- END;
- END;